public class PermIter{
  /** Wandelt ein Permutationsarray (mit n zusammenhängenden Werten)
    * zwischen Index- und Differenznummerierung um.
    * Dabei entspricht z.B. die Indexnummerierung 2301 der Differenznummerierung
    * 2200. Die Methode arbeitet in place, d.h. das Argument wird verändert.
    * @param werte ein Array mit n paarweise verschiedenen Zahlen zwischen 0
    *   und n-1.
    * @param todiff wenn true, wird die gewöhnliche Indexdarstellung in die
    *   Differenzdarstellung umgewandelt, sonst andersherum.
    */
  public static void recode(int[] werte, boolean todiff){
    int j, n=werte.length;
    int[] shift=new int[n];
    for(int i=0; i<n; i++) shift[i]=i;
    for(int i=0; i<n; i++){
      if(todiff){// Index --> Differenz
        j=-1;
        while(shift[++j]!=werte[i]);
        werte[i]=j;
      } else{// Differenz --> Index
        j=werte[i];
        werte[i]=shift[j];
      }
      while(j<n-1 && shift[j]<shift[j+1]) shift[j]=shift[++j];
    }
  }

  /** Erzeugt die nächste Permutation in Differenznummerierung.
    * Die Methode arbeitet in place, das Argument wird also verändert.
    * @param diffperm die aktuelle Permutation.
    */
  public static void increment(int[] diffperm){
    int i=diffperm.length;
    while(i>0){
      diffperm[--i]++;
      if(diffperm[i]<diffperm.length-i) break;
      diffperm[i]=0;
    }
  }

  /** Erzeugt die nächste Permutation in Indexnummerierung.
    * Die Methode arbeitet in place, das Argument wird also verändert.
    * @param perm die aktuelle Permutation in gewöhnlicher Indexdarstellung.
    */
  public static void nextperm(int[] perm){
    recode(perm, true);
    increment(perm);
    recode(perm, false);
  }

  //========================= Teste Permutationen =====================//
  public static void main(String[] args){
    int[] werte=new int[args.length];
    for(int i=0; i<werte.length; i++) werte[i]=Integer.parseInt(args[i]);
    for(int f=fact(werte.length); f>0; f--){
      ausgabe(werte);
      nextperm(werte);
    }
  }

  public static void ausgabe(int[] a){
    for(int i=0; i<a.length; i++) System.out.print(a[i]);
    System.out.println();
  }

  public static int fact(int n){
    int ret=n;
    while(--n>1) ret*=n;
    return ret;
  }
}
